#include "etat.h"
#include "pion.h"
#include "joueur.h"
#include "frontiere.h"
#include "plateaurisq.h"
#include "log.h"
#include <QtCore>

Etat::Etat(int id, QString nom, Continent *continent, PlateauRisQ *plateau) : QObject()
{
    this->id = id;
    this->nom = nom;
    this->continent = continent;
    this->continent->addEtats(this);
    this->joueur = NULL;
    this->plateau = plateau;
}

void Etat::setJoueur(Joueur *j){
    int cpt = 0;
    joueur = j;
    if (j == NULL) return; // nécessaire sinon plantage en cliquant sur Quitter (fenêtre serveur)
    LOG2(ODEBUG,"pays envahit : %1 au joueur %2",this->nom,this->joueur->getId());

    this->joueur = j;

    /* Compte et met à jour le nombre de pays pour le joueur */

     for(int i=0;i < plateau->joueurs().count(); ++i){
        cpt = 0;
        foreach(Etat *e, plateau->etats()){
            if (e->getJoueur() != NULL && e->getJoueur() == plateau->joueurs().at(i) ){
                ++cpt;
            }
        }
        plateau->joueurs().at(i)->setNbEtat(cpt);
    }

    emit updateGraphics();
    LOG2(ODEBUG,"pays envahit : %1 au joueur %2",this->nom,this->joueur->getId());
}


void Etat::addPion(Pion *pion)
{

    // Juste avant d'ajouter le pion on regarde si le joueur est à 0 (pas eu de renforts par exemple)
    //if (joueur->getNbPionRestant() != 0)
    //{

    if ( plateau->getattaques() || plateau->getdeplacement_troupes())
    {
        joueur->setNbPion(joueur->getNbPion()+1); // dû au -1 du rmpion lors d'un déplacement
    }
    else
    {
        /* Met à jour les stats pour le joueur */
        joueur->setNbPionRestant(joueur->getNbPionRestant()-1);
        joueur->setNbPion(joueur->getNbPion()+1);
        //LOG(ODEBUG, "Fonction addpion hors de plateau->getattaques");
    }

        // à changer plus tard, un remove ou un retour à 0 réincrémentera.
        if (joueur->getNbPionRestant() == 0)
            plateau->setJoueurs_ayant_restant_nul(plateau->getJoueurs_ayant_restant_nul() + 1);

        /* Set l'état et le joueur associé à ce pion */
        pion->setEtat(this);
        pion->setJoueur(joueur);

        /* Ajout le pion a la liste des pions */
        pionsList << pion;

        /* Leve le signal nouveauPion */
        emit nouveauPion(pion);

        /* Met à jour la position des pions autour de l'état */
        adjustPion();
        //*
        //LOG(ODEBUG, "AVANT appel de change statut automatique pour changer de joueur");
          // pour avoir changement automatique de joueur
        //if ( plateau->getplacement_Initial() )
        //{
            //emit ChangeStatut();
            //LOG(ODEBUG, "Appel de change statut automatique pour changer de joueur");
        //}
        //*/
    //}
    //else
    //{
    //    delete pion; // suite au new pion pésent dans le mouseDoubleClick appelant cet addpion
    //    emit ChangeStatut();
    //}
}

void Etat::removePion(Pion *pion)
{
    /* Met à jour les stats pour le joueur */
    //joueur->setNbPionRestant(joueur->getNbPionRestant()+1);
    joueur->setNbPion(joueur->getNbPion()-1);

    /* Enleve le pion de la liste */
    pionsList.removeOne(pion);

    /* Leve le signal supprimerPion */
    emit supprimerPion(pion);

    /* Met à jour la position des pions autour de l'état */
    adjustPion();
}


void Etat::removeLastPion()
{
    Pion *p = pionsList.last();
    removePion(p);
}

void Etat::adjustPion()
{
    int i = 0, max = pionsList.size();
    foreach (Pion *pion, pionsList){
        pion->doAdjust(i++, max);
    }
}

void Etat::adjustFrontiere()
{
    foreach (Frontiere *frontiere, frontieresList){
        frontiere->doAdjust();
    }
}

bool Etat::canMove(Pion *pion)
{
    if ( pion == NULL ) return false;

    return canMove(pion->getEtat());
}

bool Etat::canMove(Etat *etat)
{
    foreach(Frontiere *f, frontieresList){
        if(f->sourceEtat() == etat || f->destEtat() == etat){
            return true;
        }
    }
    return false;
}
